#include <stdio.h>

// 写一个函数div16，对于整数参数x返回x/16的值。
// 该函数的实现不能使用除法运算符、模运算符、乘法运算符、加法运算符、条件语句、比较运算符、循环。
// 可以假设数据类型int是32位长，使用补码表示，而右移是算术右移。
int div16(int x) {
    // 右移4位，相当于除以16
    return (x >> 4);
}

int div16_negative_ceil(int x) {
    // 右移4位，相当于除以16
    // 如果x是负数，向上取整
    return x < 0 ? (x + 15) >> 4 : (x >> 4);
}

// 因为题目要求不能使用条件语句，所以我们可以使用位运算来实现
// x>>31 的结果的位模式是全0或全1，负数时是全1，正数时是全0。我们可以利用这个特性来实现向上取整的效果。
// 将其与15，即1111进行按位与操作的时候相当于把高位全都清零，然后要么得到0，要么得到15。
// 这样我们就可以在负数时加上15，正数时加上0。
// 这样就可以在不使用条件语句的情况下实现向上取整的效果。
int div16_negative_ceil_only_bitmove(int x) {
    // 右移4位，相当于除以16
    // 如果x是负数，向上取整
    return (x + ((x >> 31) & 15)) >> 4;
}
// 测试函数
int main() {
    int x = 64;
    printf("div16(%d) = %d\n", x, div16(x)); // 输出: div16(64) = 4
    x = -128;
    printf("div16(%d) = %d\n", x, div16(x)); // 输出: div16(-128) = -8
    x = -127;
    printf("div16(%d) = %d\n", x, div16(x)); // 输出: div16(-127) = -8
    x = -127;
    printf("div16_negative_ceil(%d) = %d\n", x, div16_negative_ceil(x)); // 输出: div16_negative_ceil(-127) = -7
    x = -127;
    printf("div16_negative_ceil_only_bitmove(%d) = %d\n", x, div16_negative_ceil_only_bitmove(x)); // 输出: div16_negative_ceil(-127) = -7
    return 0;
}

// Usage: gcc -o div16.out 2.42-div16.c
// Run with: ./div16.out
// The output will show the results of dividing the input integers by 16
// using the div16 function.
// Output:
// div16(64) = 4
// div16(-128) = -8
// The div16 function uses bitwise right shift to perform the division
// by 16 without using division, multiplication, addition, or any other
// arithmetic operations. It is a simple demonstration of how to manipulate
// bits and perform integer division using bitwise operations.
